#!/bin/bash
###############################################################################
#       脚本名称: filter_level.sh
#       功能描述: 日志级别过滤器,根据级别范围过滤日志
#       作者: 林再来
#       日期: 2025-10-14
#       版本: 1.0
#       功能:
#           1、按最小级别过滤
#           2、按最大级别过滤
#           3、按级别范围过滤
#       依赖(插件/命令):
#           无
###############################################################################

# 防止重复加载
[[ -n "${_FILTER_LEVEL_LOADED:-}" ]] && return 0
readonly _FILTER_LEVEL_LOADED=1

# 加载日志级别模块
_FILTER_LEVEL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${_FILTER_LEVEL_DIR}/../core/log_level.sh"

#-----------------------------------------------------------------------------
# 全局变量
#-----------------------------------------------------------------------------
declare -gA _FILTER_LEVEL_CONFIG

#-----------------------------------------------------------------------------
# 函数: 初始化级别过滤器
# 参数: $1 - 过滤器名称
#       $2 - 最小级别(可选,默认TRACE)
#       $3 - 最大级别(可选,默认FATAL)
# 返回: 0-成功
#-----------------------------------------------------------------------------
function _filter_level_init() {
    local filter_name="$1"
    local min_level="${2:-TRACE}"
    local max_level="${3:-FATAL}"
    
    _FILTER_LEVEL_CONFIG["${filter_name}_min"]="$min_level"
    _FILTER_LEVEL_CONFIG["${filter_name}_max"]="$max_level"
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 应用级别过滤
# 参数: $1 - 过滤器名称
#       $2 - 日志事件JSON
# 返回: 0-通过, 1-拒绝
#-----------------------------------------------------------------------------
function _filter_level_apply() {
    local filter_name="$1"
    local event="$2"
    
    # 提取日志级别
    local event_level=$(echo "$event" | grep -oP '(?<="level":")[^"]*' 2>/dev/null)
    
    # 获取过滤器配置
    local min_level="${_FILTER_LEVEL_CONFIG[${filter_name}_min]:-TRACE}"
    local max_level="${_FILTER_LEVEL_CONFIG[${filter_name}_max]:-FATAL}"
    
    # 检查最小级别
    if ! _log_level_compare "$event_level" "$min_level"; then
        return 1  # 低于最小级别,拒绝
    fi
    
    # 检查最大级别
    if ! _log_level_compare "$max_level" "$event_level"; then
        return 1  # 高于最大级别,拒绝
    fi
    
    return 0  # 通过
}

#-----------------------------------------------------------------------------
# 测试函数
#-----------------------------------------------------------------------------
function _filter_level_test() {
    echo "=== 级别过滤器测试 ==="
    
    echo ""
    echo "1. 初始化过滤器(INFO到ERROR):"
    _filter_level_init "test_filter" "INFO" "ERROR"
    echo "  ✓ 初始化成功"
    
    echo ""
    echo "2. 测试不同级别的日志:"
    
    local levels=("TRACE" "DEBUG" "INFO" "WARN" "ERROR" "FATAL")
    for level in "${levels[@]}"; do
        local test_event="{\"level\":\"$level\",\"message\":\"测试消息\"}"
        if _filter_level_apply "test_filter" "$test_event"; then
            echo "  $level: ✓ 通过"
        else
            echo "  $level: ✗ 拒绝"
        fi
    done
}

# 如果直接执行此脚本,运行测试
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    _filter_level_test
fi

